#set( $symbol_pound = '#' )
#set( $symbol_dollar = '$' )
#set( $symbol_escape = '\' )
/**
 * 
 */
package ${package}.negocio.impl;

import java.util.List;

import javax.annotation.security.PermitAll;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.PersistenceException;

import ${package}.dao.api.UsuarioDao;
import ${package}.model.Usuario;
import ${package}.negocio.api.UsuarioNegocio;
import br.com.framework.negocio.exception.NegocioException;
import br.com.framework.negocio.impl.BaseNegocioImpl;
import br.com.framework.util.security.CryptoUtils;

/**
 * @author Cleber
 *
 */
@Stateless
@PermitAll
public class UsuarioNegocioImpl extends BaseNegocioImpl<Usuario, UsuarioDao> implements
		UsuarioNegocio {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 
	 */
	public UsuarioNegocioImpl() {
	}
	
	@Inject
	protected void setDao(UsuarioDao dao) {
		super.setDao(dao);
	}
	
	@Override
	protected void validateEntity(Usuario entidade, boolean isInsert)
			throws NegocioException {
		Usuario usuEx = findByLogin(entidade.getLogin());
		if (usuEx != null) {
			if (!isInsert && !usuEx.getId().equals(entidade.getId())) {
				throw new NegocioException("usuario.erro.negocio.loginJaCadastrado");
			}
		}
	}
	
	@Override
	public void insert(Usuario entidade) throws PersistenceException,
			NegocioException {
		entidade.setSenha(CryptoUtils.getEncryptedSha1(entidade.getSenha()));
		if (!entidade.getSenha().equals(entidade.getConfirmaSenha())) {
			throw new NegocioException("usuario.erro.negocio.senhasNaoConferem");
		}
		super.insert(entidade);
	}

	@Override
	public Usuario findByLogin(String login) throws PersistenceException {
		Usuario usuEx = new Usuario();
		usuEx.setLogin(login);
		List<Usuario> list = findByExample(usuEx);
		if (!list.isEmpty()) {
			return list.iterator().next();
		}
		return null;
	}

	@Override
	public void atualizarSenha(String login, String senha, String novaSenha,
			String confirmaNovaSenha) throws PersistenceException,
			NegocioException {
		Usuario usuEx = findByLogin(login);
		if (usuEx != null) {
			if (usuEx.getSenha().equals(CryptoUtils.getEncryptedSha1(senha))) {
				if (isSenhaValida(novaSenha) && isSenhaValida(confirmaNovaSenha)) {
					if (novaSenha.equals(confirmaNovaSenha)) {
						usuEx.setSenha(CryptoUtils.getEncryptedSha1(novaSenha));
						this.update(usuEx);
					} else {
						throw new NegocioException("usuario.erro.negocio.senhasNaoConferem");
					}
				} else {
					throw new NegocioException("usuario.erro.negocio.novaSenhaNaoInformadaOuInvalidas");
				}
			} else {
				throw new NegocioException("usuario.erro.negocio.autenticacao");
			}
		} else {
			throw new NegocioException("usuario.erro.negocio.loginNaoEncontrado");
		}
	}
	
	/**
	 * @param senha
	 * @return
	 */
	private boolean isSenhaValida(String senha) {
		return senha != null && (senha.trim().length() >= 3  && senha.trim().length() <= 255);
	}
	
}
